package common.serializer.myCode;

import common.Message.MessageType;
import common.serializer.mySerializer.Serializer;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class MyDecoder extends ByteToMessageDecoder {

    /**
     * 传入字节流解码为业务对象，并将解码后的对象添加到out中，供下一个handler处理
     * @param ctx Netty的ChannelHandlerContext，提供对管道、通道和事件的访问
     * @param in  ByteBuf对象，接受到的字节流，netty的缓冲区，字节数组
     * @param out List对象，存储解码后的对象
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 读取消息类型
        short messageType = in.readShort();
        System.out.println("messageType:" + messageType);
        // 判断是否是RPC请求或者响应消息
        if (messageType != MessageType.REQUEST.getCode() && messageType != MessageType.RESPONSE.getCode()){
            System.out.println("暂不支持此种数据");
        }
        // 读取序列化器类型
        Short serializerType = in.readShort();
        // 获取序列化对象，根据序列化器类型获取对应的序列化器
        Serializer serializer = Serializer.getSerializerByCode(serializerType);
        if (serializer == null){
            throw new RuntimeException("没有找到对应的序列化器");
        }
        // 读取消息长度和数据
        int length = in.readInt();
        byte[] bytes = new byte[length];
        // 从输入缓冲区读取指定数量的字节到字节数组中
        in.readBytes(bytes);
        // 反序列化对象赋值变量中
        Object object = serializer.deserialize(bytes, messageType);
        out.add(object);
    }
}
